/*
 * SPDX-FileCopyrightText: 2022-2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.output

import android.content.Context
import com.sanji.audio_test.Preferences
import com.sanji.audio_test.R
import java.time.Duration

/**
 * 保留策略密封接口
 * 定义录音文件保留策略的基本行为
 */
sealed interface Retention {
    /**
     * 格式化为用户可读的字符串
     *
     * @param context 应用上下文
     * @return 格式化后的字符串
     */
    fun toFormattedString(context: Context): String

    /**
     * 转换为原始偏好设置值
     *
     * @return 无符号整数值
     */
    fun toRawPreferenceValue(): UInt

    companion object {
        // 默认保留策略：保留所有文件
        val default = NoRetention

        /**
         * 从原始偏好设置值创建保留策略
         *
         * @param value 原始值，0表示不删除任何文件，其他值表示保留天数
         * @return 对应的保留策略对象
         */
        fun fromRawPreferenceValue(value: UInt): Retention = if (value == 0u) {
            NoRetention
        } else {
            DaysRetention(value)
        }

        /**
         * 从偏好设置创建保留策略
         *
         * @param prefs 偏好设置对象
         * @return 保留策略对象
         */
        fun fromPreferences(prefs: Preferences): Retention = prefs.outputRetention ?: default
    }
}

/**
 * 无保留策略数据对象
 * 表示保留所有录音文件，不自动删除
 */
data object NoRetention : Retention {
    /**
     * 格式化为用户可读的字符串
     */
    override fun toFormattedString(context: Context): String = "Keep all"

    /**
     * 转换为原始偏好设置值（0表示保留所有）
     */
    override fun toRawPreferenceValue(): UInt = 0u
}

/**
 * 按天数保留策略的值类
 * 表示只保留指定天数内的录音文件
 *
 * @param days 保留天数
 */
@JvmInline
value class DaysRetention(val days: UInt) : Retention {
    /**
     * 格式化为用户可读的字符串
     */
    override fun toFormattedString(context: Context): String =
        context.resources.getQuantityString(R.plurals.retention_days, days.toInt(), days.toInt())

    /**
     * 转换为原始偏好设置值
     */
    override fun toRawPreferenceValue(): UInt = days

    /**
     * 转换为Duration对象
     *
     * @return 对应的持续时间
     */
    fun toDuration(): Duration = Duration.ofDays(days.toLong())
}